/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor. 
 */
package Persistencia;

import Negocio.Archivo;
import Negocio.Comentario;
import Negocio.Foto;
import Negocio.Ruta;
import Negocio.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.GregorianCalendar;


/**
 *
 * @author JAVA
 */
public class PArchivo {

    //por hacer y dejar claro como lo hacemos
    public static List<Archivo> mostrarArchivoBD(Usuario usuario, Archivo archivo) {
        List<Archivo> archivos = new ArrayList();

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();


            //aqui comprueba que lo que le llega es una foto o una ruta
            if (archivo instanceof Foto) {
                rs = st.executeQuery("Select id,id_usuario,fecha,titulo,rutaarchivo "
                        + "FROM archivo "
                        + "WHERE isFoto=1 AND id_usuario=" + usuario.getId() + "");

                while (rs.next()) {
                    Archivo a = new Foto(rs.getInt("id"), usuario, rs.getDate("fecha"), rs.getTime("fecha"), rs.getString("titulo"), rs.getString("rutaarchivo"));
                    archivos.add(a);
                }
            }

            if (archivo instanceof Ruta) {
                rs = st.executeQuery("Select id,id_usuario,fecha,titulo,rutaarchivo,tiempo,lugar "
                        + "FROM archivo "
                        + "WHERE isFoto=0 AND id_usuario=" + usuario.getId() + "");

                while (rs.next()) {
                    Archivo a = new Ruta(rs.getInt("id"), usuario, rs.getDate("fecha"), rs.getTime("fecha"), rs.getString("titulo"), rs.getString("rutaarchivo"), rs.getString("tiempo"), rs.getString("lugar"));
                    archivos.add(a);
                }
            }

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        return archivos;
    }
    
    public static List<Archivo> mostrarArchivoAmigosBD(Usuario usuario) {
        List<Archivo> archivos = new ArrayList();

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            
            //cojo la lista de amigos para buscar en la base de datos nuevas notificaciones
            List<Usuario> listAmigos = usuario.getListAmigos();
            int tam = listAmigos.size();
            int i=0;            
            for(i=0;i<tam;i++){
             
            //aqui comprueba que lo que le llega es una foto o una ruta
           
                rs = st.executeQuery("Select id,id_usuario,fecha,titulo,rutaarchivo,tiempo,lugar,isFoto "
                        + "FROM archivo "
                        + "WHERE id_usuario=" + listAmigos.get(i).getId() + "");

                while(rs.next()) {
                    if(rs.getInt("isFoto")==1){
                       Archivo a = new Foto(rs.getInt("id"), listAmigos.get(i), rs.getDate("fecha"), rs.getTime("fecha"), rs.getString("titulo"), rs.getString("rutaarchivo")); 
                       archivos.add(a);
                    }
                    else{
                       Archivo a = new Ruta(rs.getInt("id"), listAmigos.get(i), rs.getDate("fecha"), rs.getTime("fecha") , rs.getString("titulo"), rs.getString("rutaarchivo"), rs.getString("tiempo"), rs.getString("lugar"));
                       archivos.add(a);
                    }                  
                }
                //aki controlar que solo devuelva una lista con las notificaciones recientes
                //y un máximo de 15
              
            }
            int j;
            
            //con esto ya ordena la lista por fecha y hora y asi tengo las actualizaciones mas rcientes
            //todavia no he hecho que solo coja 15 porque no tengo tantos archivos XD , pero se puede 
            //usar el metodo archivos.subList(tam, tam) para cogerla por indice (creo) 
            
            for(i=0;i<archivos.size();i++){
                for(j=i+1;j<archivos.size();j++){
                
                    if(archivos.get(i).getFecha().compareTo(archivos.get(j).getFecha())<0){                        
                        Archivo a = archivos.get(i);
                        archivos.set(i, archivos.get(j));
                        archivos.set(j, a);

                    }else if(archivos.get(i).getFecha().compareTo(archivos.get(j).getFecha())==0 && (archivos.get(i).getHora().compareTo(archivos.get(j).getHora())<0)){
                        Archivo a = archivos.get(i);
                        archivos.set(i, archivos.get(j));
                        archivos.set(j, a);
                    }
                } 
            }
        

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        return archivos;
    }

    //Para que muestre 6 fotos/6rutas para ponerlas en el perfil.jsp
    public static List<Archivo> mostrar6ArchivosBD(Usuario usuario, Archivo archivo) {
        List<Archivo> archivos = new ArrayList();
        List<Archivo> listaArchivos = new ArrayList();

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();


            //aqui comprueba que lo que le llega es una foto o una ruta
            if (archivo instanceof Foto) {
                rs = st.executeQuery("Select id,id_usuario,fecha,titulo,rutaarchivo "
                        + "FROM archivo "
                        + "WHERE isFoto=1 AND id_usuario=" + usuario.getId() + "");

                while (rs.next()) {
                    Archivo a = new Foto(rs.getInt("id"), usuario, rs.getDate("fecha"), rs.getTime("fecha"), rs.getString("titulo"), rs.getString("rutaarchivo"));
                    archivos.add(a);
                }
                
                //Para devolver solo una lista de 6 archivos
                listaArchivos = archivos;
                if(listaArchivos.size() > 6){
                    listaArchivos = archivos.subList(0,6);
                }
                
                
            }

            if (archivo instanceof Ruta) {
                rs = st.executeQuery("Select id,id_usuario,fecha,titulo,rutaarchivo,tiempo,lugar "
                        + "FROM archivo "
                        + "WHERE isFoto=0 AND id_usuario=" + usuario.getId() + "");

                while (rs.next()) {
                    Archivo a = new Ruta(rs.getInt("id"), usuario, rs.getDate("fecha"), rs.getTime("fecha"), rs.getString("titulo"), rs.getString("rutaarchivo"), rs.getString("tiempo"), rs.getString("lugar"));
                    archivos.add(a);
                }
               
                //Para devolver solo una lista de 6 archivos
                listaArchivos = archivos;
                if(listaArchivos.size() > 6){
                    listaArchivos = archivos.subList(0,6);
                }
            }

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        return listaArchivos;
    }
    public static Archivo seleccionarArchivoBD(int id, Archivo archivo) {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        Archivo a = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            
            archivo.setId(id);

            //aqui comprueba que lo que le llega es una foto o una ruta
            if (archivo instanceof Foto) {
                
                rs = st.executeQuery("Select id,id_usuario,fecha,titulo,rutaarchivo "
                        + "FROM archivo "
                        + "WHERE id= " + id);

                if (rs.next()) {
                    
                    Usuario u = Usuario.selecionarUsuarioLite(rs.getInt("id_usuario"));
                    a = new Foto(rs.getInt("id"), u, rs.getDate("fecha"),
                            rs.getString("titulo"), rs.getString("rutaarchivo"),
                            Comentario.devolverListaComentarios(archivo));
                }
            } else if (archivo instanceof Ruta) {
                rs = st.executeQuery("Select id,id_usuario,fecha,titulo,rutaarchivo,tiempo,lugar "
                        + "FROM archivo "
                        + "WHERE id= " + id + "");

                if (rs.next()) {
                    Usuario u = Usuario.selecionarUsuarioLite(rs.getInt("id_usuario"));
                    a = new Ruta(rs.getInt("id"), u, rs.getDate("fecha"), 
                            rs.getString("titulo"), rs.getString("rutaarchivo"), 
                            Comentario.devolverListaComentarios(archivo), 
                            rs.getString("tiempo"), rs.getString("lugar"));
                }
            }

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        return a;
    }

    public static void crearArchivoBD(Archivo archivo) {

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();


            //inserta Foto            
            if (archivo instanceof Foto) {
                Foto f = (Foto) archivo;//casteo
                
                
                Date date = new Date();
                SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                String prueba = dtf.format(date);
              
                int isfoto = 1;
                
                st.executeUpdate("INSERT INTO archivo (id_usuario,fecha,titulo,rutaarchivo,tiempo,lugar,isFoto)"
                        + "VALUES (" + f.getUsuario().getId() + ",'" + dtf.format(date) + "','" + f.getTitulo() + "','" + f.getRutaArchivo() + "','" + "" + "','" + "" + "'," + isfoto + ")");

                //para que coja el id una vez creado en la base de datos                
                rs = st.executeQuery("SELECT ID FROM archivo ORDER BY ID DESC");

                if (rs.next()) {
                    archivo.setId(rs.getInt("id"));
                }
            }
            //inserta Ruta
            if (archivo instanceof Ruta) {
                Ruta r = (Ruta) archivo;//casteo
                SimpleDateFormat dtr = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                int isfoto = 0;
                String prueba = "1985-11-11 02:01:02";
                st.executeUpdate("INSERT INTO archivo (id_usuario,fecha,titulo,rutaarchivo,tiempo,lugar,isFoto)"
                        + "VALUES (" + r.getUsuario().getId() + ",'" + dtr.format(r.getFecha()) + "','" + r.getTitulo() + "','" + r.getRutaArchivo() + "','" + r.getTiempo() + "','" + r.getLugar() + "'," + isfoto + ")");

                //para que coja el id una vez creado en la base de datos                
                rs = st.executeQuery("SELECT ID FROM archivo ORDER BY ID DESC");

                if (rs.next()) {
                    archivo.setId(rs.getInt("id"));
                }


            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }

    public static void actualizarArchivoBD(Archivo archivo) {

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            
            //MAMONEO DE LAS HORAS DE LOS COJONES
            Date fecha = new Date();
            

            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd H:mm:ss");    
            String fechaSubida = dateFormat.format(fecha);
           
            
            
            //consulta para modificar foto            
            if (archivo instanceof Foto) {             
                       
                String SQL = "UPDATE archivo "
                    + "SET id_usuario = " + archivo.getUsuario().getId()
                    + ", fecha = '" + fechaSubida
                    + "', titulo = '" + archivo.getTitulo()
                    + "', rutaarchivo = '" + archivo.getRutaArchivo()                                     
                    + "' WHERE ID = "+archivo.getId();

            st.executeUpdate(SQL);
            }
            //consulta para modificar Ruta
            if (archivo instanceof Ruta) {                
                
                String SQL = "UPDATE archivo "
                    + "SET id_usuario = " + archivo.getUsuario().getId()
                    + ", fecha = '" + fechaSubida
                    + "', titulo = '" + archivo.getTitulo()
                    + "', rutaarchivo = '" + archivo.getRutaArchivo()                                     
                    + "' WHERE ID = "+archivo.getId();

            st.executeUpdate(SQL);
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }

    public static void eliminarArchivoBD(Archivo archivo) {

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();

            st.executeUpdate("DELETE FROM archivo WHERE " + archivo.getId() + "=id");


        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }
}
